#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "palindromo.h"

#define ARQUIVO 	"./arq/shakespe.txt"
#define ARQ_PALI	"./resultados/shak_pal.txt"
#define TAM_BUFF 4096

#ifdef TESTE1
	#define TITULO "\nResultado (somente frases palindromo):\n\n"
	#define OLHAFRASE
#elif defined TESTE2
	#define TITULO "\nResultado (somente palavras palindromo):\n\n"
	#define OLHAPALAVRA
#elif defined TESTE3
	#define TITULO "\nResultado (frases e palavras palindromo):\n\n"
	#define OLHAFRASE
	#define OLHAPALAVRA
#else
	#define TITULO "\nResultado (somente contar os palindromo):\n\n"
	#define OLHAFRASE
	#define OLHAPALAVRA
	#define SALVAPALI
#endif

char buffer[TAM_BUFF];

int main(){
	int it, lido;
	int palavras, palindromos, frases, frasespal;
	int iniciof, fimf;
	int pfd;
 	unsigned long t1, t2;

	#ifdef OLHAFRASE
	int fplflag;
	#endif
	#ifdef OLHAPALAVRA
	int iniciop, fimp;
	int pplflag;
	#endif
	#ifdef SALVAPALI
	FILE * pf_pal;
	#endif

	if ((pfd = open(ARQUIVO, O_RDONLY, 0 )) == -1)
	{
	    fprintf(stderr, "Nao foi possivel abrir: %s.\n", ARQUIVO );
	    exit(1);
	}

	#ifdef SALVAPALI
	if ((pf_pal = fopen(ARQ_PALI,"w")) == NULL)
	{
	    fprintf(stderr, "Nao foi possivel abrir: %s.\n", ARQ_PALI );
	    exit(1);
	}
	#endif

	t1 = clock();

	palavras = palindromos = frases = frasespal = 0;

	it = 0;
	do{
		//le um bloco de codigo
		lido = read(pfd, (void *) buffer, TAM_BUFF);
		it++;

		//encontra o inicio da primeira frase
		fimf = iniciof = 0;
		while(iniciof < lido &&
		(buffer[iniciof] == '\n' || buffer[iniciof] == '\r' || buffer[iniciof] == '.' || 
		 buffer[iniciof] == ':' || buffer[iniciof] == ';' || buffer[iniciof] == '?' ||
		 buffer[iniciof] == '!')) iniciof++;

		while(iniciof < lido){
			//encontra o fim da frase
			fimf = iniciof;
			while(fimf < lido && buffer[fimf] != '\n' && buffer[fimf] != '\r'
				&& buffer[fimf] != '.' && buffer[fimf] != ':' && buffer[fimf] != ';'
				&& buffer[fimf] != '?' && buffer[fimf] != '!') fimf++;

			if(fimf == TAM_BUFF) break;

			#ifdef OLHAFRASE
			//conta frase e verifica se e palindromo
			frases++;
			fplflag = check_frase( buffer + iniciof, fimf - iniciof);

			//se a frase e palindromo conta e salva
			if(fplflag){
				frasespal++;
				#ifdef SALVAPALI
				buffer[fimf] = '\0';
				fprintf(pf_pal, "%s\n", buffer + iniciof);
				#endif
			}
			#endif

			#ifdef OLHAPALAVRA
			//encontra o inicio da primeira palavra na frase
			iniciop = iniciof;
			while(iniciop < fimf && (UCASE(buffer[iniciop]) < 'A' ||
				 UCASE(buffer[iniciop]) > 'Z')) iniciop++;

			
			while(iniciop < fimf){
				
				//encontra o fi da palavra
				fimp = iniciop;
				while(fimp < fimf && (UCASE(buffer[fimp]) >= 'A' &&
				  	UCASE(buffer[fimp]) <= 'Z')) fimp++;

				//conta palavra e verifica se é palindromo
				palavras++;
				pplflag = check_palavra( buffer + iniciop, fimp - iniciop);

				//se encontrou uma palavra palindromo conta e salva
				if(pplflag){
					palindromos++;
					#ifdef SALVAPALI
					buffer[fimp] = '\0';
					fprintf(pf_pal, "%s\n", buffer + iniciop);
					#endif
				}

				//encontra o inicio da proxima palavra
				iniciop = fimp;
				while(iniciop < lido && (UCASE(buffer[iniciop]) < 'A' ||
					  UCASE(buffer[iniciop]) > 'Z')) iniciop++;
			}
			#endif

			iniciof = fimf + 1;

			//encontra o inicio da proxima frase
			while(iniciof < lido &&
				(buffer[iniciof] == '\n' || buffer[iniciof] == '\r' || buffer[iniciof] == '.' || 
		 		buffer[iniciof] == ':' || buffer[iniciof] == ';' || buffer[iniciof] == '?' ||
		 		buffer[iniciof] == '!')) iniciof++;
		}

		//volta ao inicio da frase que foi cortada
		if(fimf == lido)
				lseek(pfd, SEEK_CUR, iniciof - lido); 

	}
	while(lido == TAM_BUFF);

	t2 = clock();

	/* Imprime relatorio */
	printf(TITULO);
	printf("\tTempo total: %lfs\n", ((double) (t2 - t1))/CLOCKS_PER_SEC);
	printf("\tAcessos ao arquivo: %d\n", it);
	#ifdef OLHAFRASE
	printf("\tFrases:   %d palindromos\n", frasespal);
	printf("\t          %d total\n", frases);
	#endif
	#ifdef OLHAPALAVRA
	printf("\tPalavras: %d palindromos\n", palindromos);
	printf("\t          %d total\n", palavras);
	#endif

	close(pfd);
	#ifdef SALVAPALI
	fclose(pf_pal);
	#endif
	return 0;
}
